home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / unixlib.lha / unix / src / dup.c < prev    next >
C/C++ Source or Header  |  1995-09-05  |  921b  |  50 lines

  1.  
  2. #include "amiga.h"
  3. #include "files.h"
  4.  
  5. int __close(int fd);
  6.  
  7. static int do_dup(int oldd, int newd)
  8. {
  9.     int retd;
  10.     struct fileinfo *fi;
  11.     struct fileinfo **fdtab;
  12.  
  13.     if (_get_free_fd(&retd, &fdtab) < 0)
  14.     return -1;
  15.  
  16.     if (newd < 0) {
  17.     newd = retd;        /* it's a dup(), use retd as newd */
  18.     retd = -1;
  19.     } else {            /* it's a dup2(), we don't need a new fd */
  20.     fdtab[retd] = NULL;    /* but only fdtab, so free the slot      */
  21.     }
  22.  
  23.     if (!(fi = _find_fd(oldd)) || newd >= _last_fd()) {
  24.     errno = EBADF;
  25.     return -1;
  26.     }
  27.     if (retd >= 0) {        /* it's a dup2() */
  28.     if (oldd == newd)
  29.         return (newd);    /* ignore the call: dup2(x, x) */
  30.     __close(newd);        /* cannot fail */
  31.     }
  32.     fdtab[newd] = fi;
  33.     fi->count++;
  34.     return (newd);
  35. }
  36.  
  37. int dup(int oldd)
  38. {
  39.     return (do_dup(oldd, -1));
  40. }
  41.  
  42. int dup2(int oldd, int newd)
  43. {
  44.     if (newd < 0) {
  45.     errno = EBADF;
  46.     return -1;
  47.     }
  48.     return (do_dup(oldd, newd));
  49. }
  50.